import time
from datetime import datetime
import colorama

colorama.init()

# 调用说明：
# 1. 引入：
#    - sys.path.append(r"C:\Users\candy\Desktop\")
#    - from printer import IndentPrinter
#
# 2. 初始化：printer = IndentPrinter(indent=0, indent_str="    ", timestamp=True)
#    - indent: 缩进级别（正数，默认为0）。
#    - indent_str: 缩进字符或字符串（默认为4个空格）。
#    - timestamp: 是否打印时间戳（布尔值，默认为True）。
#
# 3. 设置参数：printer.set(indent=1, indent_str="--", timestamp=False)
#    - 动态调整缩进级别、缩进字符和时间戳设置。
#
# 4. 添加或减少缩进：printer.add(1) 或 printer.add(-1)
#    - 正数增加缩进，负数减少缩进。
#
# 5. 打印内容：printer("内容1", "内容2", ...) 或 printer.print("内容1", "内容2", ..., color="RED")
#    - 支持传入多个文本，自动拼接后打印。
#    - 颜色名称支持：BLACK, BLUE, CYAN, GREEN, LIGHTBLACK_EX, LIGHTBLUE_EX, LIGHTCYAN_EX,
#      LIGHTGREEN_EX, LIGHTMAGENTA_EX, LIGHTRED_EX, LIGHTWHITE_EX, LIGHTYELLOW_EX,
#      MAGENTA, RED, RESET, WHITE, YELLOW, reset。
#
# 6. 插入运行耗时：printer("[主流程]", "已完成，耗时<run_time>。", color="RED", run_time="hh:mm:ss")
#    - 在文本中使用 <run_time> 占位符，指定 run_time 参数为 "ss"、"mm:ss" 或 "hh:mm:ss"。
#    - 通过 printer.reset_run_time() 重置运行时间计时器。

class IndentPrinter:
    colors = {
        name: getattr(colorama.Fore, name.upper())
        for name in colorama.Fore.__dict__
        if name.isupper()
    }
    colors["reset"] = colorama.Style.RESET_ALL
    indent = 0
    indent_str = "    "
    timestamp = True

    def __init__(self, **kwargs):
        self.reset_run_time()
        self.set(**kwargs)

    def set(self, **kwargs):
        for key, value in kwargs.items():
            if hasattr(self, key):
                setattr(self, key, value)
        self.indent = max(0, self.indent)

    def add(self, num):
        self.indent += num
        self.indent = max(0, self.indent)

    def reset_run_time(self):
        self.start_time = time.time()

    def format_run_time(self, elapsed_time, run_time_format):
        formats = {
            "ss": lambda t: f"{int(t)}s",
            "mm:ss": lambda t: f"{int(t // 60):02d}:{int(t % 60):02d}",
            "hh:mm:ss": lambda t: f"{int(t // 3600):02d}:{int((t % 3600) // 60):02d}:{int(t % 60):02d}",
        }
        if run_time_format not in formats:
            raise ValueError("非法时间格式. 请使用 'ss'、'mm:ss'、'hh:mm:ss'。")
        return formats[run_time_format](elapsed_time)

    def print(
        self,
        *args,
        sep=" ",
        end="\n",
        file=None,
        flush=False,
        color=None,
        run_time=None,
    ):
        text = " ".join(str(arg) for arg in args)

        if run_time:
            elapsed_time = time.time() - self.start_time
            formatted_time = self.format_run_time(elapsed_time, run_time)
            text = text.replace("<run_time>", formatted_time)

        time_str = (
            f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] "
            if self.timestamp
            else ""
        )

        content = self.indent_str * self.indent + time_str + text
        if color and color in self.colors:
            content = f"{self.colors[color]}{content}{self.colors['reset']}"
        print(content)

    def __call__(self, *args, **kwargs):
        self.print(*args, **kwargs)
